class Application {
    constructor(){
        this.middleware = [] // 保存中间件
    }
    listen(){
        const server = require('http').createServer(this.callback()) // 1.不直接调用，使用函数生成
        server.listen(...arguments)
    }
    use(fn){
        this.middleware.push(fn)
    }
    // 4.异步递归遍历处理函数
    compose(middleware){
        // 4.1.返回函数方便定制传参
        return function(){
            const dispatch = index => {
                if(index >= middleware.length){
                    // 4.4. 返回成功的 promsie，表示结束
                    return Promise.resolve()
                }

                // 4.2.获取、调用处理函数
                const fn = middleware[index]

                // 4.5. 强制使用 Promise 包装，处理异步流程
                return Promise.resolve(
                     // 暂时没有 ctx ，先用空对象，后续调用下一个
                    fn({},()=>dispatch(index+1))
                )
            }
            return dispatch(0) // 4.3.第一个中间件
        }
    }
    callback(){
        // 3.获取中间件函数，compose 用于异步递归遍历
        const fnMiddleware = this.compose(this.middleware)
        // 2.异步串行执行中间件
        const handleRequest = (req,res)=>{
            // 调用处理，先给 res 提示
            fnMiddleware().then(()=>{
                res.end('koa')
            }).catch(err=>{
               res.end(err.message)
            })
        }
        return handleRequest
    }
}

module.exports = Application